$.extend(ST, {
    getRatableImg: function(img, maxWidth, maxHeight) {
        var wh = img.match(/\.(\d+)x(\d+)\./);
        maxHeight = typeof maxHeight == 'undefined' ? 99999 : maxHeight;
        if (wh != null && wh.length > 2) {
            var scale = Math.min(maxWidth / wh[1], maxHeight / wh[2]);
            var width = Math.round(wh[1] * scale);
            var height = Math.round(wh[2] * scale);
            return img + '.' + width + 'x' + height + '.jpg';
        } else {
            return img;
        }
    },
  $Coms: ['dropdown','toggleAll'],
  render: function (scale,$Coms) {
    scale = document.getElementById(scale)||scale;
    if(!scale) scale = document;
    if(!$Coms) $Coms = ST.$Coms;
    for (var i = $Coms.length - 1; i >= 0; i--) {
      ST.todo($Coms[i],scale);
    }
  },
  /*
   * 弹出表单编辑框
   * @param url 地址
   * @param option 弹窗选项
   * {
   *   title 窗口标题
   *   width 窗口宽度
   *   height 窗口高度（不填则自动按照实际大小显示）
   *   mask 是否显示遮罩
   *   onshow 窗口显示后执行的JS方法
   *   onclose 窗口关闭后执行的JS方法
   * }
   */
  editBox: function (url, option) {
    var uid = $.getUid();
    ST.tipMsg({'loading':'载入中...请稍后'});
    //加载php模板内容
    ST.getTpl(url+'/st_jsid/'+uid, function (data) {
      ST.hideMsg();
      var errorMsg = '获取内容失败！';
      if(!data){
          ST.tipMsg({'error':errorMsg});
          return;
      }
      if(data.status){
          var status = (data.status+'').toLowerCase();
          if(status=='error'){
              return;
          }
          if(status=='tip_error'){
              ST.tipMsg({'error':data.info||data.message||errorMsg});
              return;
          }
      }
        //定义获取iframe方法
        function getform(id) {
            return $('#' + id).find('form').eq(0)[0];
        }

        //初始化msgbox
        ST['$formbox_' + uid] = ST.msgbox({
            title: option.title,
            content: data
        }, [
            {text: '保存', fun: function (a, e) {
                e.cancle = true;
                var f = getform(ST['$formbox_' + uid].ctrlId);
                f && f.onsubmit();
            }},
            {text: '取消', fun: ''}
        ], option.width || 800, option.height || '', option.mask);
        ST['$formbox_' + uid].onclose = function () {
            delete ST['$formbox_' + uid];
            option.onclose && option.onclose();
        };
      setTimeout(function () {
        var bid = ST['$formbox_' + uid].ctrlId, f = getform(bid);
        if (f) {
          var succFun = $(f).attr('afterSubFun');
          if (succFun) {
            ST['afterSubFun_' + uid] = function (j) {
              ST['$formbox_' + uid].hide();
              ST[succFun](j);
            };
          } else {
            ST['afterSubFun_' + uid] = function (j) {
              ST['$formbox_' + uid].hide();
              if (j.data && j.data.url) {
                location.href = j.data.url;
              } else {
                ST.reload();
              }
            };
          }
          $(f).attr('afterSubFun', 'afterSubFun_' + uid);
          ST.Verify.addVform(f);
          ST.render(bid);
        }
        option.onshow && option.onshow();
      }, 50);
    });
  },
  //获取PHP模板
  getTpl: function (url, callback) {
    $("body").queue(function () {
      $.get(url,function (data) {
        $("body").dequeue();
        callback && callback(data);
      }).error(function (e, xhr, opt) {
          $("body").dequeue();
          e.url = url;
          e.data = null;
          ST.debug && ST.debugErro(e, xhr, opt);
        });
    });
  },
  //字符串转对象
  stringToObject: function (str) {
    str = (str||'').toString();
    var s = $.trim(str), obj = {};
    if (s) {
      if (s.substring(0, 1) != "{") {
        s = "{" + s + "}";
      }
      obj = (new Function("return " + s))();
    }
    return obj;
  },
  parseConfig:function(configStr,_default){
    return $.extend(_default||{},ST.stringToObject(configStr));
  },
  /*
     全选
  * */
  $ToggleAll:{},
  toggleAll:function(scale){
    var $triggers = $('.st-toggleall',$(scale));
    if ($triggers.length == 0) return;
    $triggers.each(function () {
        //判断是否已初始化
        var $this = $(this), id = $this.attr('id');
        if(id && ST.$ToggleAll[id]){
          return;
        }
        //初始化插件
        try{
          var uid = id||$.getUid();
          var config = ST.parseConfig($this.attr('data-config'));
          !id && $(this).attr('id',uid);
          //加载js文件
          ST.getJs('ST.ToggleAll',function(){
            ST.$ToggleAll[uid] = new ST.ToggleAll(uid,config);
          });
        }catch(e){

        }
    });
  },
    /*
   * 虚拟select框
   * @用法 在select上添加st-dropdown样式，在data-config中配置：
   * {
   *    subId:'',     //子选项标识
   *    subConfig:{}, //读取子选项的配置信息（详见ST.loadSubOption）
   *    inBox:false,  //是否在弹窗中，自动为下拉菜单设置适当的z-index属性，若zIndex不为0则以zIndex配置为准
   *    zIndex:0,     //层级，若不为0则为下拉菜单设置z-index属性
   *    onChange:null //模拟select的onChange事件
   * }
   */
  $Dropdown:{},
  dropdown: function (scale) {
    var $select = $('select.st-dropdown',$(scale));
    if ($select.length == 0) return;
    $select.each(function () {
      //判断是否已初始化
      var $this = $(this), id = $this.attr('id');
      if(id && ST.$Dropdown[id]){
        return;
      }
      //初始化插件
      try{
        $this.hide();
        var uid = id||$.getUid();
        var config = ST.parseConfig($this.attr('data-config'),{
          inBox:false,
          zIndex:0,
          onChange:null
        });
        !id && $(this).attr('id',uid);
        //获得数据
        var $options = $this.find('option'),data = [];
        $options.each(function () {
          data.push({text: $(this).html(), value: $(this).val()});
        });
        //构建UI
        var uiStr =
          '<div class="dropdown" id="'+uid+'_dropdown">'+
            '<a class="dropdown-toggle" href="javascript:;">'+
              '<span class="dropdown-label" id="'+uid+'_dropdown_lab"></span>'+
              '<span class="dropdown-arrow"><i class="icon i-chevron-down"></i></span>'+
            '</a>'+
          '</div>';
        $this.after($(uiStr));
        //初始化ddlist
        ST.$Dropdown[uid] = ST.ddList(uid+'_dropdown', data);
        var $t = ST.$Dropdown[uid];
        //设置选中项
        $t.selByValue($this.val());
        //设置选中回调方法
        $t.onselected = function(o){
          $this.val(o.value);
          if(ST.Verify && $this.attr('opt')){
            ST.Verify.check($this.parents('form:first')[0], $this[0]);
          }
          if(config.subId){
            ST.loadSubOption(o,uid,config.subId,config.subConfig);
          }
          config.onChange && config.onChange.call(this,o);
        };
        //设置层级
        if(config.inBox||config.zIndex){
          $t.setZIdx(config.zIndex||$.Widget.Msgbox.$count+1);
        }
      }catch(e){
        $this.show();
      }
    });
  },
  /*
  获取子选项
  @描述 用与扩展父dropdown的onChange回调方法

  @用法：
  (1)（可选）定义父dropdown的onChange回调方法，
    注：也可直接使用ST.loadSubOption作为回调方法
    如：ST.MY_METHOD = function(o){
          ST.loadSubOption(o,父选项id,子选项id,个性化配置项);
       }
  (2)（必须）配置父dropdown的onChange回调方法，
    如 <select class="st-dropdown" data-config="onChange:MY_METHOD" id="option">

  @param o 当前选中项(格式：{text:'',value:''})
  @param pid 父select id 默认值：'option'
  @param cid 子select id 默认值：'suboption'
  @param config 个性化配置项
  {
    nodefault:false,        //无默认项
    url:ST.ACTION.loadSub,  //获取子选项的地址
    key:'id',               //父选项值发送参数key
    params:{}               //额外参数
  }
  */

  loadSubOption:function(o,pid,cid,config){
    if(!pid) pid = 'option';
    if(!cid) cid = 'suboption';
    var $p = ST.$Dropdown[pid];
    var $c = ST.$Dropdown[cid];
    if(!$p||!$c) return;
    if(!o){
      o = $p.data[0];
    }
    //获取配置信息
    config = $.extend({
      nodefault:false,        //无默认项
      url:ST.ACTION.loadSub,  //获取子选项的地址
      key:'id',               //父选项值发送参数key
      params:{}               //额外参数
    },config||{});


    //定义载入数据的方法
    function load(data){
      var $cid = $('#'+cid),val = data[0].value,htmlStr='';
      for(var i = 0,l=data.length;i<l;i++){
        htmlStr+='<option value="'+data[i].value+'">'+data[i].text+'</option>';
      }
      $cid.html(htmlStr);
      $c.changeData(data);
      $c.selByValue(val);
    }


    var _key = 'loadSub_'+cid;

    if(!ST.CACHE[_key]&&!config.nodefault){
      var dftOption = {text:'所有',value:'0'};
      var $option = $('#'+cid).find('option:first');
      if($option.length>0){
        dftOption = {text:$option.html(),value:$option.val()};
      }
      ST.CACHE[_key] = dftOption;
    }


    //读取、缓存并载入数据
    var cachekey = _key+ 'v' +o.value, tData = ST.CACHE[cachekey];

    if(tData){
      load(tData);
    }else{
      var params = {}, loadTips = '载入中...';
      params[config.key] = o.value;
      params = $.extend(config.params,params);
      $c.changeData([{text:loadTips,value:''}]);
      $c.setText(loadTips);
      ST.getJSON(config.url,params,function(j){
        if(!j) return;
        var data = (j.data||[]).slice(0);
        if(!config.nodefault){
          data.insert(ST.CACHE[_key],0);
        }
        load(data);
        ST.CACHE[cachekey] = data;
      },'','GET');
    }
  }
});
ST.TODOLIST.push({method: "render", pars: undefined});